﻿//说明：该类使用COM操作excel，需要在.pro中加入CONFIG  += qaxcontainer
#ifndef EXCELENGINE_H
#define EXCELENGINE_H

#include <QFile>

#include <QString>
#include <QStringList>

#include <QVariant>

#include <QAxBase>
#include <QAxObject>

#include <QTableWidget>
#include <QTableWidgetItem>
#include <QTreeWidget>
#include <QDebug>
#include <QMap>
enum RoadState{r_onLine,r_offLine,r_select,r_error,r_null};
typedef unsigned int UINT;

/**
  *@brief 这是一个便于Qt读写excel封装的类，同时，便于把excel中的数据
  *显示到界面上，或者把界面上的数据写入excel中，同GUI进行交互，关系如下：
  *Qt tableWidget <--> ExcelEngine <--> xls file.
  *
  *@note ExcelEngine类只负责读/写数据，不负责解析，做中间层
  *@author yaoboyuan 254200341@qq.com
  *@date 2012-412
  */
class ExcelEngine:public QWidget //,protected QObject
{
    public:
        ExcelEngine();
        ExcelEngine(QString xlsFile);
        ~ExcelEngine();
    public:
        bool Open(UINT nSheet = 1, bool visible = false);//打开xls文件
        bool Open(QString xlsFile, UINT nSheet = 1, bool visible = false);
        void Save();                //保存xls报表
        void Close();               //关闭xls报表
        void SetExcelFile(QString name);
        bool SaveDataFrTable(QTableWidget *tableWidget,bool saveAs = false,QString saveName =""); //保存数据到xls
        bool ReadDataToTable(QTableWidget *tableWidget); //从xls读取数据到ui
        bool ReadDataToTree(QTreeWidget *treeWidget);
        void CreateTreePoint(int startColumn,int startRow,int &len, QTreeWidget *treeWidget);
        void SetPointStatue(const QString ip, const int status);
        void SetIPAndStatue(const QString ip,const int statue);
        //获取第三节中车道ip
        bool GetItemLaneIP(QTreeWidgetItem* item,QString &ip);
        //获取第三节车道名
        bool GetItemLaneName(const QString ip,QString &SecName, QString &FirstName);
        QVariant GetCellData(UINT row, UINT column);                //获取指定单元数据
        bool     SetCellData(UINT row, UINT column, QVariant data); //修改指定单元数据

        UINT GetRowCount()const;
        UINT GetColumnCount()const;

        bool IsOpen();
        bool IsValid();
    protected:
        bool CreateXlsFile(const QString &xlsFile);
        void Clear();

    public:
        QAxObject *pExcel;      //指向整个excel应用程序
        QAxObject *pWorkbooks;  //指向工作簿集,excel有很多工作簿
        QAxObject *pWorkbook;   //指向sXlsFile对应的工作簿
        QAxObject *pWorksheet;  //指向工作簿中的某个sheet表单

        QString   sXlsFile;     //xls文件路径
        UINT      nCurrSheet;   //当前打开的第几个sheet
        bool      bIsVisible;   //excel是否可见
        int       nRowCount;    //行数
        int       nColumnCount; //列数
        int       nStartRow;    //开始有数据的行下标值
        int       nStartColumn; //开始有数据的列下标值

        bool      bIsOpen;      //是否已打开
        bool      bIsValid;     //是否有效
private:
        //记录第二节点与名称
        QMap<QString,QTreeWidgetItem*> m_WidItemAndNameMap;
        //记录第三节点与IP
        QMap<QString,QTreeWidgetItem*> m_WidItemAndIPMap;
        //记录IP与对应的设备连接状态,用于初始化树时
        QMap<QString,int> m_IPAndStatueMap;
};

#endif // EXCELENGINE_H
